package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.List;

import javax.persistence.criteria.JoinType;

import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOEmpresa;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Empresa;

/**
 * @author usuario
 */
@Repository("daoEmpresa")
public class DAOEmpresaImpl extends DaoImpl<Empresa, Integer> implements IDAOEmpresa, Serializable {

    private static Logger logger = Logger.getLogger(DAOBancoImpl.class);
    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public Empresa obtenerEntidadConUbigeo(Integer id) throws DAOException {
        try {
            Empresa ent = (Empresa) sessionFactory.getCurrentSession().createCriteria(Empresa.class).add(Restrictions.idEq(id)).uniqueResult();
            Hibernate.initialize(ent.getIdUbigeo());
            return ent;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }

    @Override
    public Empresa validarRuc(String ruc) throws DAOException {
        Empresa empresaBuscada = null;
        try {
            empresaBuscada = (Empresa) sessionFactory.getCurrentSession().createCriteria(Empresa.class)
                    .add(Restrictions.eq("ruc", ruc))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return empresaBuscada;
    }

    @Override
    public Empresa validarRazonSocial(String razonSocial) throws DAOException {
        Empresa empresaBuscada = null;
        try {
            empresaBuscada = (Empresa) sessionFactory.getCurrentSession().createCriteria(Empresa.class)
                    .add(Restrictions.eq("razonSocial", razonSocial))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return empresaBuscada;
    }
    
    @SuppressWarnings("unchecked")
	@Override
	@Transactional
    public List<Empresa> obtenerListaEmpresasPorUsuario(Integer idUsuario)
    		throws DAOException {
    	 try {
             return   sessionFactory.getCurrentSession().createCriteria(Empresa.class)
               				 .createAlias("listaUsuarioEmpresa","usuarioEmpresa",CriteriaSpecification.INNER_JOIN)
               				 .add(Restrictions.eq("usuarioEmpresa.usuario.id",idUsuario))
               				 .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
               				 .list();
         } catch (Exception e) {
        	 e.printStackTrace();
             throw new DAOException(e.getMessage(), e);
         }
    	
    }
}
